package com.autorun.server.controller;

import com.autorun.server.dto.ApiResponse;
import com.autorun.server.entity.Role;
import com.autorun.server.service.RoleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;
import java.util.Map;

/**
 * 角色管理控制器
 * 
 * @author autorun
 * @version 1.0.0
 */
@Slf4j
@RestController
@RequestMapping("/api/roles")
public class RoleController {

    @Autowired
    private RoleService roleService;

    /**
     * 获取角色统计信息
     * 
     * @return 统计信息
     */
    @GetMapping("/stats")
    public ApiResponse<Map<String, Object>> getRoleStats() {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            Map<String, Object> stats = roleService.getUserRoleStats(userId);
            return ApiResponse.success(stats);
        } catch (Exception e) {
            log.error("获取角色统计失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取角色统计失败: " + e.getMessage());
        }
    }

    /**
     * 获取角色列表
     * 
     * @return 角色列表
     */
    @GetMapping
    public ApiResponse<List<Role>> getRoleList() {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            List<Role> roles = roleService.getUserRoles(userId);
            return ApiResponse.success(roles);
        } catch (Exception e) {
            log.error("获取角色列表失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取角色列表失败: " + e.getMessage());
        }
    }

    /**
     * 根据窗口ID获取角色
     * 
     * @param windowId 窗口ID
     * @return 角色信息
     */
    @GetMapping("/window/{windowId}")
    public ApiResponse<Role> getRoleByWindowId(@PathVariable String windowId) {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            
            Role role = roleService.getRoleByUserIdAndWindowId(userId, windowId);
            return ApiResponse.success(role);
        } catch (Exception e) {
            log.error("获取角色信息失败: {}", e.getMessage(), e);
            return ApiResponse.error("获取角色信息失败: " + e.getMessage());
        }
    }

    /**
     * 创建或更新角色
     * 
     * @param role 角色信息
     * @return 角色信息
     */
    @PostMapping
    public ApiResponse<Role> saveRole(@Valid @RequestBody Role role) {
        try {
            // TODO: 从认证中获取用户ID，这里暂时硬编码
            Integer userId = 1;
            role.setUserId(userId);
            
            Role savedRole = roleService.saveRole(role);
            return ApiResponse.success("保存角色成功", savedRole);
        } catch (Exception e) {
            log.error("保存角色失败: {}", e.getMessage(), e);
            return ApiResponse.error("保存角色失败: " + e.getMessage());
        }
    }

    /**
     * 更新角色
     * 
     * @param id 角色ID
     * @param role 角色信息
     * @return 角色信息
     */
    @PutMapping("/{id}")
    public ApiResponse<Role> updateRole(@PathVariable Integer id, @Valid @RequestBody Role role) {
        try {
            role.setId(id);
            Role updatedRole = roleService.saveRole(role);
            return ApiResponse.success("更新角色成功", updatedRole);
        } catch (Exception e) {
            log.error("更新角色失败: {}", e.getMessage(), e);
            return ApiResponse.error("更新角色失败: " + e.getMessage());
        }
    }

    /**
     * 删除角色
     * 
     * @param id 角色ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    public ApiResponse<Void> deleteRole(@PathVariable Integer id) {
        try {
            roleService.deleteRole(id);
            return ApiResponse.success("删除角色成功");
        } catch (Exception e) {
            log.error("删除角色失败: {}", e.getMessage(), e);
            return ApiResponse.error("删除角色失败: " + e.getMessage());
        }
    }
}